#!/usr/bin/python3
# -*- coding: UTF-8 -*-

L = [x * x for x in range(10)]
print(L)
# 可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list，从而节省大量的空间
# 把一个列表生成式的[]改成()，就创建了一个generator
g = (x * x for x in range(10))
print(g)
# 计算到最后一个元素，没有更多的元素时，抛出StopIteration的错误
print(next(g))
print(next(g))
print(next(g))
for n in g :
    print('>>', n)

# 著名的斐波拉契数列（Fibonacci），除第一个和第二个数外，任意一个数都可由前两个数相加得到
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
fib(6)

# 把fib函数变成generator
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
print(fib(6))
# generator的函数，在每次调用next()的时候执行，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行
f = fib(8)
print(next(f))
print(next(f))
print(next(f))

# 用for循环调用generator时，发现拿不到generator的return语句的返回值。
# 如果想要拿到返回值，必须捕获StopIteration错误，返回值包含在StopIteration的value中
g = fib(6)
while True:
    try:
        x = next(g)
        print(x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break


# 杨辉三角
def triangles():
    L = [1]
    while True:
        yield L
        L.append(0)
        L = [L[i - 1] + L[i] for i in range(len(L))]

n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break


print([y for y in range(2)])
L = [1, 0]
print(L(0-1) )


